In a computer network where data is sent from point A to point B, it is often desirable to send data both reliably and non-reliably. Data that is sent reliably from point A is guaranteed to reach point B; this guarantee is generally implemented by requiring point B to acknowledge receipt of the data. Data that is sent non-reliably from point A is not guaranteed to reach point B. Reliable data has the obvious advantage that its delivery can be assured, but it also has the disadvantage that acknowledging receipt is costly of resources and decreases the throughput of the system. If non-delivery of data can be tolerated, then non-reliable delivery is generally more efficient.
One technique for sending both reliable and non-reliable data is to use two different protocols—e.g., the Transport Control Protocol (“TCP”) for reliable data, and the User Datagram Protocol (“UDP”) for non-reliable data. For example, a computer system may send some type of crucial data (e.g., player position updates in a video game, etc.) via TCP, and may send data whose non-receipt can be tolerated (e.g., audio packets, etc.) via UDP. A problem with such an arrangement is that when the total volume of data to be sent approaches or exceeds the capacity of the network connection, the network tends to become swamped with the TCP traffic, while no UDP traffic gets through. Since the TCP and UDP protocols operate independently and do not share status information with each other, they are unable to “tune” their throughput relative to each other in order to balance the traffic.
Another problem that arises in the use of reliable data delivery is in the way that reliable protocols acknowledge receipt, which tends to decrease the throughput of the system. Conventionally, reliable protocols use a “ping-pong” technique, wherein the sender sends a message and then waits for an acknowledgment before sending another message. This technique delays traffic because the sending and acknowledging of each message incurs a round-trip latency of twice the transmission time between the sending and receiving nodes. Improvements to this technique include the “burst” protocol and the “windowing” protocol. In a burst protocol, plural messages are sent, and a single acknowledgment is sent of all the messages in the “burst.” This technique cuts down on round-trip latency, since it is not necessary to wait for an acknowledgment for every message—only every second, third, or fourth message, etc. In a windowing protocol, data is sent continuously, but transmission is stopped if transmission of data gets ahead of acknowledgments by a specified “window” (i.e., a specified amount of data or number of packets). If receipt of data is not acknowledged, all data sent subsequently to the non-acknowledged data must be resent since there is no way to identify which data was lost and which data was received. Moreover, windowing protocols do not presently provide a way to send reliable and non-reliable data in the same window.
In view of the foregoing, there is a need for a network protocol that overcomes the limitations and drawbacks of the prior art.